package com.baiytfp.hf.HFDataExchange.action.controller.service;

import com.baiytfp.hf.HFDataExchange.action.service.RoleService;
import com.baiytfp.hf.HFDataExchange.common.model.base.TableName;
import com.baiytfp.hf.HFDataExchange.common.model.table.Role;
import com.baiytfp.hf.baiytfp.common.db.DBManager;
import com.baiytfp.hf.baiytfp.common.db.HFPager;
import com.baiytfp.hf.baiytfp.framework.base.BaseController;
import com.baiytfp.hf.baiytfp.hfutils.HFDBHelper;
import com.baiytfp.hf.baiytfp.hfutils.HFRequest;
import com.baiytfp.hf.baiytfp.hfutils.HFResponse;
import com.baiytfp.hf.baiytfp.hfutils.HFWeb;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.servlet.ModelAndView;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.util.HashMap;
import java.util.List;
import java.util.Map;


@Controller
@RequestMapping("/service/upload")
public class UploadSController extends BaseController{

	@Autowired
	public RoleService roleService;

	public UploadSController() {

	}

	/*
	 * 只把内容保存到 yxbase_file_content 表，并生成 attach_code
	 */
	/*
	@RequestMapping("/uploadfilecontent")
	public ModelAndView uploadfilecontent(HttpServletRequest request,
										  HttpServletResponse response)
			throws Exception {

		//配置变量，于文件 config.properies 文件配置
		String maxSize = HFConfig.getPropConfig("attach_max_size", "10");
		String allowExtStr = ConfigUtil.getPropConfig("attach_allow_ext", "");
		String savePath = ConfigUtil.getPropConfig("attach_save_path", "");

		//传入参数
		String attachDesc = RequestUtil.getString(request, "attachDesc");

		Map<String, Object> map = new HashMap();

		final long MAX_SIZE = Integer.parseInt(maxSize) * 1024 * 1024;// 设置上传文件最大为 5M

		// 允许上传的文件格式的列表
		final String[] allowedExt = allowExtStr.split(",");
		response.setContentType("text/html");

		// 设置字符编码为UTF-8, 这样支持汉字显示
		response.setCharacterEncoding("UTF-8");

		// 实例化一个硬盘文件工厂,用来配置上传组件ServletFileUpload
		DiskFileItemFactory dfif = new DiskFileItemFactory();
		dfif.setSizeThreshold(4096);// 设置上传文件时用于临时存放文件的内存大小,这里是4K.多于的部分将临时存在硬盘
		dfif.setRepository(new File(savePath));// 设置存放临时文件的目录,web根目录下的/upload/uploadTemp目录

		// 用以上工厂实例化上传组件
		ServletFileUpload sfu = new ServletFileUpload(dfif);
		// 设置最大上传尺寸
		sfu.setSizeMax(MAX_SIZE);

		// 从request得到 所有 上传域的列表

		List fileList = null;
		try {

			fileList = sfu.parseRequest(request);

		} catch (FileUploadException e) {// 处理文件尺寸过大异常

			if (e instanceof SizeLimitExceededException) {

				map.put("ok", new Boolean(false));
				map.put("info", "文件尺寸超过规定大小:" + MAX_SIZE + "字节");

				ResponseUtil.returnJson(response, map);
			}
			e.printStackTrace();
		}

		// 没有文件上传
		if (fileList == null || fileList.size() == 0) {
			map.put("ok", new Boolean(false));
			map.put("info", "请选择上传文件");

			ResponseUtil.returnJson(response, map);
		}

		long res = 0;
		List<Attach_file> fileContentList = new ArrayList();
		// 得到所有上传的文件
		Iterator fileItr = fileList.iterator();
		// 循环处理所有文件
		while (fileItr.hasNext()) {
			FileItem fileItem = null;
			String path = null;
			long size = 0;
			// 得到当前文件
			fileItem = (FileItem) fileItr.next();
			// 忽略简单form字段而不是上传域的文件域(<input type="text" />等)
			if (fileItem == null || fileItem.isFormField()) {
				continue;
			}
			// 得到文件的完整路径
			path = fileItem.getName();
			// 得到文件的大小
			size = fileItem.getSize();
			if ("".equals(path) || size == 0) {

				map.put("ok", new Boolean(false));
				map.put("info", "请选择上传文件");

				ResponseUtil.returnJson(response, map);
			}

			// 得到去除路径的文件名
			String t_name = path.substring(path.lastIndexOf("\\") + 1);
			// 得到文件的扩展名(无扩展名时将得到全名)
			String t_ext = t_name.substring(t_name.lastIndexOf(".") + 1);
			// 拒绝接受规定文件格式之外的文件类型
			int allowFlag = 0;
			int allowedExtCount = allowedExt.length;
			for (; allowFlag < allowedExtCount; allowFlag++) {
				if (allowedExt[allowFlag].equals(t_ext))
					break;
			}
			if (allowFlag == allowedExtCount) {

				StringBuffer sbr = new StringBuffer();
				sbr.append("请上传以下类型的文件 ：");
				for (allowFlag = 0; allowFlag < allowedExtCount; allowFlag++){
					sbr.append("*." + allowedExt[allowFlag]
							+ ";");
				}

				map.put("ok", new Boolean(false));
				map.put("info", sbr.toString());

				ResponseUtil.returnJson(response, map);
			}

			//当前日期(按月保存)
			String date = DateUtil.formatDateByFormat(new Date(), "yyyyMM");
			savePath = savePath + "/" + date;	//增加当月目录
			//创建文件夹
			File f = new File(savePath);
			if(!f.exists()){
				f.mkdirs();
			}

			try {
				InputStream is = fileItem.getInputStream();

				//生成附件唯一标识
				String attachCode = SHACoder.encodeSHA512Hex(ByteUtil.input2byte(is));

				is.close();	//关闭 流，否则 无法删除临时文件，一直被java所持有

				// 保存的最终文件完整路径(使用文件唯一标识作为文件名)
				String file_name = attachCode + "." + t_ext;



				Attach_file fileContent = commonService.itemRead(DBManager.getConnection(), TableName.ATTACH_FILE, " where attach_code=? ", Attach_file.class, attachCode);

				if(fileContent != null){	//数据库已有文件
					//System.out.println("文件已经存在 ");

				}else{
					// 保存文件
					fileItem.write(new File(savePath + "/" + file_name));

					//添加到数据库
					fileContent = new Attach_file();
					fileContent.setAttach_addr(savePath);
					fileContent.setAttach_code(attachCode);
					fileContent.setAttach_ext(t_ext);
					fileContent.setFile_name(file_name);
					fileContent.setAttach_desc(attachDesc);
					fileContent.setAttach_size(size);
					fileContent.setAttach_status(0);
					fileContent.setAttach_type(0);
					fileContent.setCreate_man(RequestUtil.getUserCode(request));
					fileContent.setCreate_time(DateUtil.getCurrentDT());

					commonService.itemAdd(DBManager.getConnection(), TableName.ATTACH_FILE, fileContent);
				}

				res += 1;

				fileContentList.add(fileContent);

			} catch (Exception e) {
				e.printStackTrace();
			}
		}

		if(res > 0){
			map.put("ok", new Boolean(true));
			map.put("info", "文件上传成功!");

			if(fileContentList.size() == 1){	//只有一个文件时
				//上传的文件内容
				map.put("fileContent", fileContentList.get(0));	//直接返回第一个文件
			}else{
				//上传的文件列表
				map.put("fileList", fileContentList);
			}

			ResponseUtil.returnJson(response, map);
		}else{
			//默认返回信息
			map.put("ok", new Boolean(false));
			map.put("info", "上传失败!");
			ResponseUtil.returnJson(response, map);
		}

		return null;
	}
	*/
//
//
//	@RequestMapping("/uploadfile")
//	public ModelAndView uploadfile(HttpServletRequest request, HttpServletResponse response) throws Exception{
//		ResponseUtil.responseTextMsg(response, JsonHelper.getJsonObject(uploadService.uploadfileNorm(request, response)).toString());
//
//		return null;
//	}
//
//	@RequestMapping("/uploadfiles")
//	public ModelAndView uploadfiles(HttpServletRequest request, HttpServletResponse response) throws Exception{
//		ResponseUtil.returnResult(response, uploadService.uploadfileNorm(request, response));
//
//		return null;
//	}
//
//	/*
//	 * 只把文件上传并保存到硬盘，但不保存到数据库
//	 */
//	@RequestMapping("/onlyuploadfile")
//	public ModelAndView onlyuploadfile(HttpServletRequest request, HttpServletResponse response) throws Exception{
//		//配置变量，于文件 config.properies 文件配置
//		String maxSize = ConfigUtil.getPropConfig("attach_max_size", "10");
//		String allowExtStr = ConfigUtil.getPropConfig("attach_allow_ext", "");
//		String savePath = ConfigUtil.getPropConfig("attach_save_path", "");
//
//		//传入参数
//		String attachDesc = RequestUtil.getString(request, "attachDesc");
//
//		Map<String, Object> map = new HashMap();
//
//		final long MAX_SIZE = Integer.parseInt(maxSize) * 1024 * 1024;// 设置上传文件最大为 5M
//
//		// 允许上传的文件格式的列表
//		final String[] allowedExt = allowExtStr.split(",");
//		response.setContentType("text/html");
//
//		// 设置字符编码为UTF-8, 这样支持汉字显示
//		response.setCharacterEncoding("UTF-8");
//
//		// 实例化一个硬盘文件工厂,用来配置上传组件ServletFileUpload
//		DiskFileItemFactory dfif = new DiskFileItemFactory();
//		dfif.setSizeThreshold(4096);// 设置上传文件时用于临时存放文件的内存大小,这里是4K.多于的部分将临时存在硬盘
//		dfif.setRepository(new File(savePath));// 设置存放临时文件的目录,web根目录下的/upload/uploadTemp目录
//
//		// 用以上工厂实例化上传组件
//		ServletFileUpload sfu = new ServletFileUpload(dfif);
//		// 设置最大上传尺寸
//		sfu.setSizeMax(MAX_SIZE);
//
//		// 从request得到 所有 上传域的列表
//
//		List fileList = null;
//		try {
//
//			fileList = sfu.parseRequest(request);
//
//		} catch (FileUploadException e) {// 处理文件尺寸过大异常
//
//			if (e instanceof SizeLimitExceededException) {
//
//				map.put("ok", new Boolean(false));
//				map.put("info", "文件尺寸超过规定大小:" + MAX_SIZE + "字节");
//
//				ResponseUtil.returnJson(response, map);
//			}
//			e.printStackTrace();
//		}
//
//		// 没有文件上传
//		if (fileList == null || fileList.size() == 0) {
//			map.put("ok", new Boolean(false));
//			map.put("info", "请选择上传文件");
//
//			ResponseUtil.returnJson(response, map);
//		}
//
//		long res = 0;
//		List<Attach_file> fileContentList = new ArrayList();
//		// 得到所有上传的文件
//		Iterator fileItr = fileList.iterator();
//		// 循环处理所有文件
//		while (fileItr.hasNext()) {
//			FileItem fileItem = null;
//			String path = null;
//			long size = 0;
//			// 得到当前文件
//			fileItem = (FileItem) fileItr.next();
//			// 忽略简单form字段而不是上传域的文件域(<input type="text" />等)
//			if (fileItem == null || fileItem.isFormField()) {
//				continue;
//			}
//			// 得到文件的完整路径
//			path = fileItem.getName();
//			// 得到文件的大小
//			size = fileItem.getSize();
//			if ("".equals(path) || size == 0) {
//
//				map.put("ok", new Boolean(false));
//				map.put("info", "请选择上传文件");
//
//				ResponseUtil.returnJson(response, map);
//			}
//
//			// 得到去除路径的文件名
//			String t_name = path.substring(path.lastIndexOf("\\") + 1);
//			// 得到文件的扩展名(无扩展名时将得到全名)
//			String t_ext = t_name.substring(t_name.lastIndexOf(".") + 1);
//			// 拒绝接受规定文件格式之外的文件类型
//			int allowFlag = 0;
//			int allowedExtCount = allowedExt.length;
//			for (; allowFlag < allowedExtCount; allowFlag++) {
//				if (allowedExt[allowFlag].equals(t_ext))
//					break;
//			}
//			if (allowFlag == allowedExtCount) {
//
//				StringBuffer sbr = new StringBuffer();
//				sbr.append("请上传以下类型的文件 ：");
//				for (allowFlag = 0; allowFlag < allowedExtCount; allowFlag++){
//					sbr.append("*." + allowedExt[allowFlag]
//							+ ";");
//				}
//
//				map.put("ok", new Boolean(false));
//				map.put("info", sbr.toString());
//
//				ResponseUtil.returnJson(response, map);
//			}
//
//			//没有保存到数据库，归为other目录保存
//			savePath = savePath + "/other";
//			//当前日期(按月保存)
//			String date = DateUtil.formatDateByFormat(new Date(), "yyyyMM");
//			savePath = savePath + "/" + date;	//增加当月目录
//			//创建文件夹
//			File f = new File(savePath);
//			if(!f.exists()){
//				f.mkdirs();
//			}
//
//			try {
//				InputStream is = fileItem.getInputStream();
//
//				//生成附件唯一标识
//				String attachCode = SHACoder.encodeSHA512Hex(ByteUtil.input2byte(is));
//
//				is.close();	//关闭 流，否则 无法删除临时文件，一直被java所持有
//
//				// 保存的最终文件完整路径(使用文件唯一标识作为文件名)
//				String file_name = attachCode + "." + t_ext;
//
//
//
//				Attach_file fileContent = commonService.itemRead(DBManager.getConnection(), TableName.ATTACH_FILE, " where attach_code=? ", Attach_file.class, attachCode);
//
//				if(fileContent != null){	//数据库已有文件
//					//System.out.println("文件已经存在 ");
//
//					//更新上传人和上传时间
//					fileContent.setCreate_man(RequestUtil.getUserCode(request));
//					fileContent.setCreate_time(DateUtil.getCurrentDT());
//				}else{
//					// 保存文件
//					fileItem.write(new File(savePath + "/" + file_name));
//
//					//添加到数据库
//					fileContent = new Attach_file();
//					fileContent.setAttach_addr(savePath);
//					fileContent.setAttach_code(attachCode);
//					fileContent.setAttach_ext(t_ext);
//					fileContent.setFile_name(file_name);
//					fileContent.setAttach_desc(attachDesc);
//					fileContent.setAttach_size(size);
//					fileContent.setAttach_status(0);
//					fileContent.setAttach_type(0);
//					fileContent.setCreate_man(RequestUtil.getUserCode(request));
//					fileContent.setCreate_time(DateUtil.getCurrentDT());
//
//					//不写入数据库，其他一样
//					//commonService.itemAdd(DBManager.getConnection(), TableName.ATTACH_FILE, fileContent);
//				}
//
//				res += 1;
//
//				fileContentList.add(fileContent);
//
//			} catch (Exception e) {
//				e.printStackTrace();
//			}
//		}
//
//		if(res > 0){
//			map.put("ok", new Boolean(true));
//			map.put("info", "文件上传成功!");
//
//			if(fileContentList.size() == 1){	//只有一个文件时
//				//上传的文件内容
//				map.put("fileContent", fileContentList.get(0));	//直接返回第一个文件
//			}else{
//				//上传的文件列表
//				map.put("fileList", fileContentList);
//			}
//
//			ResponseUtil.returnJson(response, map);
//		}else{
//			//默认返回信息
//			map.put("ok", new Boolean(false));
//			map.put("info", "上传失败!");
//			ResponseUtil.returnJson(response, map);
//		}
//
//		return null;
//	}
//
//	@RequestMapping("/getWxImage")
//	public ModelAndView getWxImage(HttpServletRequest request, HttpServletResponse response) throws Exception{
//
//		String media_id = RequestUtil.getString(request, "media_id");
//
//		//从微信服务器获取图片
////		WxMpServiceImpl wxMpService = WxMpUtil.getWxInstance();
////		File file = wxMpService.mediaDownload(media_id);
//		WxCpServiceImpl wxCpService = WxQyUtil.getWxInstance();
//		File file = wxCpService.mediaDownload(media_id);
//
//		//按常规保存
//		String savePath = ConfigUtil.getPropConfig("attach_save_path", "");
//
//		//当前日期(按月保存)
//		String date = DateUtil.formatDateByFormat(new Date(), "yyyyMM");
//		savePath = savePath + "/" + date;	//增加当月目录
//		//创建文件夹
//		File f = new File(savePath);
//		if(!f.exists()){
//			f.mkdirs();
//		}
//
//
//		try {
//			//生成附件唯一标识
//			String attachCode = "";
//
//			InputStream is = null;
//			try{
//				is = new FileInputStream(file);
//
//				//生成附件唯一标识
//				attachCode = SHACoder.encodeSHA512Hex(ByteUtil.input2byte(is));
//			}catch(Exception e){
//				e.printStackTrace();
//			}finally{
//				try {
//					if(is != null){
//						is.close(); // 关闭 流，否则 无法删除临时文件，一直被java所持有
//					}
//				} catch (Exception e) {
//					e.printStackTrace();
//				}
//			}
//
//
//
//			// 保存的最终文件完整路径(使用文件唯一标识作为文件名)
//			String file_name = attachCode + "." + FileUtil.getFileType(file.getName());
//
//
//
//			Attach_file fileContent = commonService.itemRead(DBManager.getConnection(), TableName.ATTACH_FILE, " where attach_code=? ", Attach_file.class, attachCode);
//
//			if(fileContent != null){	//数据库已有文件
//				//System.out.println("文件已经存在 ");
//
//			}else{
//				// 保存文件
//				FileUtil.inputStreamToFile(new FileInputStream(file), new File(savePath + "/" + file_name));
//
//				//添加到数据库
//				fileContent = new Attach_file();
//				fileContent.setAttach_addr(savePath);
//				fileContent.setAttach_code(attachCode);
//				fileContent.setAttach_ext(FileUtil.getFileType(file.getName()));
//				fileContent.setFile_name(file_name);
//				fileContent.setAttach_desc("");
//				fileContent.setAttach_size(file.length());
//				fileContent.setAttach_status(0);
//				fileContent.setAttach_type(0);
//				fileContent.setCreate_man(RequestUtil.getUserCode(request));
//				fileContent.setCreate_time(DateUtil.getCurrentDT());
//
//				commonService.itemAdd(DBManager.getConnection(), TableName.ATTACH_FILE, fileContent);
//			}
//
//			//返回信息到页面
//			ResponseUtil.returnResult(response, fileContent);
//
//		} catch (Exception e) {
//			e.printStackTrace();
//		}
//
//
//
//		return null;
//	}
//
//	@RequestMapping("/getWxImageMutli")
//	public ModelAndView getWxImageMutli(HttpServletRequest request, HttpServletResponse response) throws Exception{
//
//		String media_ids = RequestUtil.getString(request, "media_ids");
//
//		//按常规保存
//		String savePath = ConfigUtil.getPropConfig("attach_save_path", "");
//
//		//当前日期(按月保存)
//		String date = DateUtil.formatDateByFormat(new Date(), "yyyyMM");
//		savePath = savePath + "/" + date;	//增加当月目录
//		//创建文件夹
//		File f = new File(savePath);
//		if(!f.exists()){
//			f.mkdirs();
//		}
//
//		List<Attach_file> fileContentList = new ArrayList();
//
//		String[] media_id_arr = StringUtil.split(media_ids, ",");
//		for(int i = 0; i < media_id_arr.length; i++){
//
//			//从微信服务器获取图片
////			WxMpServiceImpl wxMpService = WxMpUtil.getWxInstance();
////			File file = wxMpService.mediaDownload(media_id_arr[i]);
//			WxCpServiceImpl wxCpService = WxQyUtil.getWxInstance();
//			File file = wxCpService.mediaDownload(media_id_arr[i]);
//
//			try {
//				//生成附件唯一标识
//				String attachCode = "";
//
//				InputStream is = null;
//				try{
//					is = new FileInputStream(file);
//
//					//生成附件唯一标识
//					attachCode = SHACoder.encodeSHA512Hex(ByteUtil.input2byte(is));
//				}catch(Exception e){
//					e.printStackTrace();
//				}finally{
//					try {
//						if(is != null){
//							is.close(); // 关闭 流，否则 无法删除临时文件，一直被java所持有
//						}
//					} catch (Exception e) {
//						e.printStackTrace();
//					}
//				}
//
//
//
//				// 保存的最终文件完整路径(使用文件唯一标识作为文件名)
//				String file_name = attachCode + "." + FileUtil.getFileType(file.getName());
//
//
//				Attach_file fileContent = commonService.itemRead(DBManager.getConnection(), TableName.ATTACH_FILE, " where attach_code=? ", Attach_file.class, attachCode);
//
//				if(fileContent != null){	//数据库已有文件
//					//System.out.println("文件已经存在 ");
//
//				}else{
//					// 保存文件
//					FileUtil.inputStreamToFile(new FileInputStream(file), new File(savePath + "/" + file_name));
//
//					//添加到数据库
//					fileContent = new Attach_file();
//					fileContent.setAttach_addr(savePath);
//					fileContent.setAttach_code(attachCode);
//					fileContent.setAttach_ext(FileUtil.getFileType(file.getName()));
//					fileContent.setFile_name(file_name);
//					fileContent.setAttach_desc("");
//					fileContent.setAttach_size(file.length());
//					fileContent.setAttach_status(0);
//					fileContent.setAttach_type(0);
//					fileContent.setCreate_man(RequestUtil.getUserCode(request));
//					fileContent.setCreate_time(DateUtil.getCurrentDT());
//
//					commonService.itemAdd(DBManager.getConnection(), TableName.ATTACH_FILE, fileContent);
//				}
//
//				fileContentList.add(fileContent);
//
//			} catch (Exception e) {
//				e.printStackTrace();
//			}
//		}
//
//		//返回信息到页面
//		ResponseUtil.returnResult(response, fileContentList);
//
//		return null;
//	}

	/*
	 * SpringMVC 集成上传方法，必须在 applicationContext.xml 中增加上传配置，
	 * 及接收的 @RequestParam("xxx") 名称“必须”与前端的 <input name="xxx" /> 的 name 相同
	 */
	/*
	@RequestMapping("/springupload")
	public @ResponseBody Map<String, Object> springupload(HttpServletRequest request,
			HttpServletResponse response, @RequestParam("file") MultipartFile[] file)
			throws Exception {

		return new HashMap();
	}
	*/

}
